iT邦幫忙

DAY 20
0

練習如何去開發一個通訊軟體 Boo it!系列 第 20

Day 20 Boo-it Au_server - 2 續章。

  • 分享至 

  • xImage
  •  

經過之前的介紹,我們這邊就要用到jQuery來做一個點擊觸發事件的效果。事件就是去啟動一個Client介面。也就是說我們的對話框畫面。那這邊先引用外部JavaScript的jQuery。第二,就是我們需要的雙擊點擊效果處發送出表單的事件。

$(document).ready(function(){

    $(".friends").dblclick(function(){

        $("#chat_f").val($(this).text());

        $("#form").submit();

    });

});

以上是用jQuery去做雙擊效果並且把表單送出的功能。 這邊程式碼較短,你也可以用JavaScript去做這個效果。只是我們用jQuery直覺上比較簡單也清楚。

前面我們有看到第二個畫面裡面有個表單

%form{:action =>"chat",:method =>"post",:id => "form"}

我們會傳送到chat這個路由去進行通訊。那麼在原本au_server裡面,就可以定義以下路由:

post '/chat' do

    # 不在登入時進入則導向一開始的畫面

    if session[:id] == nil

        session.clear

        redirect 'hello'

    else

        if session[:id].to_s.eql?(mongo_id(session[:id]).to_s)           

            login_usr = username_by_id(session[:id])

            # 歷史訊息定義

            historyid = []

            historyid.push(login_usr.to_s)

            historyid.push(params[:chat_f].to_s)

            sort_his_id = historyid.sort

            q_history_id = sort_his_id[0].to_s + sort_his_id[1].to_s

            history_json = history_by_id(q_history_id)

            # 導向chat的view畫面,並且傳遞歷史訊息過去顯示。

            haml :chat , :locals => {:user_name => "#{login_usr}",:friend_name => params[:chat_f],:history_msg => history_json} 

        else

            "You are not permissioned to login!"

        end

    end

end

好的,那我們就開始來做chat的頁面並且開始進行與chat_server的傳遞訊息溝通。

以下是 chat.haml :

!!!5

%html

    %head

        %script{:type => "text/javascript",:src => "http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"}

        %script{:type => "text/javascript",:src => "send.js"}

        %script{:type => "text/javascript",:src => "websocket.js"}

        -#:javascript

        %title Boo it!

    %body

        .content{:id => "usr_name" , :value => "#{user_name.to_s}"}= user_name

        %a talk to friends:

        %strong{:id => "fri_name" , :value => "#{friend_name.to_s}"}= friend_name

        %input{:type => "text" , :id => "boo" , :name => "boo"}

        %input{:type => "button",:onclick => "booFunction()", :value => "Boo it!"}

        .content{:id => "debug"}

        .dialog{:id => "history_msg"}

            - JSON.parse(history_msg).each do |m|

            - tmpStr = m['from'].to_s + "," + m['to'].to_s + "," + m['log'].to_s

            %p{}= tmpStr

            - end unless @do_nothing

        .dialog{:id => "msg"}

上述程式碼,我們利用jQuery去做動態與chat_server的websocket溝通。並且在溝通之前先行顯示歷史訊息,也就是由/chat路由夾帶過來的參數。如果有歷史訊息則會覆蓋history_msg的標籤。

那接下來就是傳遞訊息的部分,我們用了一個textbox以及一個按鈕來做傳送訊息的功能。那定義一個外部JavaScript(send.js)如下:

function booFunction() {

    u_name = document.getElementById("usr_name").innerHTML;

    f_name = $("#fri_name").html();

    dialog = $("#boo").val();

    ws.send(u_name + "," + f_name + "," + dialog);

}

我們利用傳送訊息的格式如下:

User1 , User2 , Message

第一個欄位為傳送方,第二個欄位為接收方,第三個欄位為傳遞訊息。

那傳遞訊息以及接收訊息則會覆蓋msg欄位。並且以append欄位加上<p>標籤顯示。

那我們接下來繼續看與chat_server端的通訊部分,也是使用jQuery來實作client端。

定義websocket.js 如下:

$(document).ready(function(){

    function debug(str){ $("#debug").append("<p>"+str+"</p>"); };

    ws = new WebSocket("ws://127.0.0.1:8080");

    ws.onmessage = function(evt) {

         var tmp = evt.data.split(",")

         if ((tmp[0] == u_name && tmp[1] == f_name) || (tmp[0] == f_name && tmp[1] == u_name)){

             $("#msg").append("<p>"+evt.data+"</p>");

         }

    };

    ws.onclose = function() { debug("socket closed"); };

    ws.onopen = function() {

      debug("connected...");

    };

});

那上述程式碼沒有多大的改變,就拿之前介紹的websocket 的client來稍作修改,唯一比較特別的部分,就是加入了判斷是誰的訊息部份以及雙方同時顯示。

DEMO畫面如下:

我們先分別登入test3 以及 test2畫面,並且在朋友名單選擇要溝通的對象

接下來可以看到test3已經進入通訊畫面,並且顯示之前溝通的歷史訊息:

可以看到test2登入也會同時顯示歷史訊息

那接下來就可以進行通訊

那我們就完成進行傳遞訊息的部分 。

可以看到以上沒有左右顯示(例如line 以及MSN 那樣的編排)

這部分只是顯示問題。我們可以後面再來進行位置調整。

那後續可以來進行其他路由的設定,這邊我們就可以先 Boo-it 一下啦。把你的訊息Boo 出去!


上一篇
Day 19 Boo-it Au_server - 1 序曲。
下一篇
Day 21 Boo-it Au_server – 3 終曲。
系列文
練習如何去開發一個通訊軟體 Boo it!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言